package com.ywu.application.standard.wiki.service;

import com.ywu.boot.context.YwuContextHolder;
import com.ywu.common.result.CommonResult;
import com.ywu.common.utils.TimerIdGenerateUtil;
import com.ywu.application.standard.wiki.data.YwuWikiDocRepository;
import com.ywu.application.standard.wiki.data.YwuWikiDocVersionRepository;
import com.ywu.application.standard.wiki.dto.YwuWikiDocVersionDto;
import com.ywu.application.standard.wiki.entity.YwuWikiDocEntity;
import com.ywu.application.standard.wiki.entity.YwuWikiDocVersionEntity;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName YwuWikiDocVersionService
 * @Description TODO
 * @Author GroundDemo
 * @Date 2024/9/21 17:35
 * @Version 1.0
 **/
@Service
public class YwuWikiDocVersionService {
    @Autowired
    private YwuWikiDocVersionRepository repository;

    @Autowired
    private YwuWikiDocRepository docRepository;

    /**
    * @Author GroundDemo
    * @Description 添加草稿版本信息
    * @Date 17:38 2024/9/21
    * @Param [ywuWikiDocVersionEntity]
    * @return void
    **/
    public void addDraftInfo(YwuWikiDocVersionEntity ywuWikiDocVersionEntity) {
        // 先删除当前resourceId删除版本为0的数据
        ywuWikiDocVersionEntity.setVersion(0);
        repository.deleteByIdAndVersion(ywuWikiDocVersionEntity);
        // 创建版本为0的数据
        ywuWikiDocVersionEntity.setId(TimerIdGenerateUtil.nextId());
        ywuWikiDocVersionEntity.createInfo(YwuContextHolder.getCurrentContext().getYwuContextUser().getUserAccount());
        repository.addVersionInfo(ywuWikiDocVersionEntity);
    }

    /**
    * @Author GroundDemo
    * @Description 根据resourceId删除所有草稿版本的数据
    * @Date 17:47 2024/9/21
    * @Param [id]
    * @return void
    **/
    public void deleteByResourceId(String id) {
        repository.deleteByResourceId(id);
    }

    /**
    * @Author GroundDemo
    * @Description 发布草稿版本数据
    * @Date 9:41 2024/9/22
    * @Param [versionEntity, currentVersion]
    * @return com.ywu.wiki.standard.entity.YwuWikiDocVersionEntity
    **/
    public YwuWikiDocVersionEntity incrementVersion(YwuWikiDocVersionEntity versionEntity, int currentVersion) {
        // 根据resourceId查询草稿版本的数据
        YwuWikiDocVersionEntity search = new YwuWikiDocVersionEntity();
        search.setResourceId(versionEntity.getResourceId());
        search.setVersion(0);
        YwuWikiDocVersionEntity queryEntity = repository.getEntity(search);
        // 修改version为0的版本为currentVersion
        YwuWikiDocVersionEntity updateEntity = new YwuWikiDocVersionEntity();
        updateEntity.setResourceId(versionEntity.getResourceId());
        updateEntity.setVersion(currentVersion);
        updateEntity.updateInfo(YwuContextHolder.getCurrentContext().getYwuContextUser().getUserAccount());
        repository.updateDraftInfo(updateEntity);
        return queryEntity;
    }

    /**
    * @Author GroundDemo
    * @Description 添加版本信息
    * @Date 9:54 2024/9/22
    * @Param [versionEntity]
    * @return void
    **/
    public void addVersionInfo(YwuWikiDocVersionEntity versionEntity) {
        versionEntity.setId(TimerIdGenerateUtil.nextId());
        versionEntity.createInfo(YwuContextHolder.getCurrentContext().getYwuContextUser().getUserAccount());
        repository.addVersionInfo(versionEntity);
    }

    /**
    * @Author GroundDemo
    * @Description 根据resourceId查询版本列表
    * @Date 10:29 2024/9/22
    * @Param [ywuWikiDocVersionDto]
    * @return com.ywu.common.result.CommonResult<java.lang.Object>
    **/
    public CommonResult<Object> queryVersionList(YwuWikiDocVersionDto ywuWikiDocVersionDto) {
        // 根据resourceId查询所有的版本信息
        YwuWikiDocVersionEntity ywuWikiDocVersionEntity = new YwuWikiDocVersionEntity();
        ywuWikiDocVersionEntity.setResourceId(ywuWikiDocVersionDto.getResourceId());
        List<YwuWikiDocVersionEntity> resList = repository.queryVersionList(ywuWikiDocVersionEntity);
        ArrayList<YwuWikiDocVersionEntity> result = new ArrayList<>();
        // 如果最后一条数据的版本为0，将其放置在首位
        if (resList.get(resList.size() - 1).getVersion() == 0) {
            YwuWikiDocVersionEntity draftEntity = resList.get(resList.size() - 1);
            resList.remove(resList.size() - 1);
            result.add(draftEntity);
        }
        result.addAll(resList);
        return CommonResult.success(result);
    }

    /**
    * @Author GroundDemo
    * @Description 删除草稿版本
    * @Date 10:45 2024/9/22
    * @Param [ywuWikiDocVersionDto]
    * @return com.ywu.common.result.CommonResult<java.lang.Object>
    **/
    @Transactional
    public CommonResult<Object> deleteDraftVersion(YwuWikiDocVersionDto ywuWikiDocVersionDto) {
        // resourceId删除草稿版本数据
        YwuWikiDocVersionEntity ywuWikiDocVersionEntity = new YwuWikiDocVersionEntity();
        ywuWikiDocVersionEntity.setVersion(0);
        ywuWikiDocVersionEntity.setResourceId(ywuWikiDocVersionDto.getResourceId());
        repository.deleteByIdAndVersion(ywuWikiDocVersionEntity);
        // 更改原始表中的hasNotReleased字段
        YwuWikiDocEntity ywuWikiDocEntity = new YwuWikiDocEntity();
        ywuWikiDocEntity.setId(ywuWikiDocVersionDto.getResourceId());
        ywuWikiDocEntity.setHasNotReleased(false);
        ywuWikiDocEntity.updateInfo(YwuContextHolder.getCurrentContext().getYwuContextUser().getUserAccount());
        docRepository.updateYwuWikiDocEntity(ywuWikiDocEntity);
        return CommonResult.success(null);
    }

    /**
    * @Author GroundDemo
    * @Description 根据版本查询历史版本信息
    * @Date 10:52 2024/9/22
    * @Param [ywuWikiDocVersionDto]
    * @return com.ywu.common.result.CommonResult<java.lang.Object>
    **/
    public CommonResult<Object> queryVersionInfo(YwuWikiDocVersionDto ywuWikiDocVersionDto) {
        // 根据resourceId和版本信息查询数据
        YwuWikiDocVersionEntity ywuWikiDocVersionEntity = new YwuWikiDocVersionEntity();
        ywuWikiDocVersionEntity.setResourceId(ywuWikiDocVersionDto.getResourceId());
        ywuWikiDocVersionEntity.setVersion(ywuWikiDocVersionDto.getVersion());
        YwuWikiDocVersionEntity entity = repository.queryVersionInfo(ywuWikiDocVersionDto);
        return CommonResult.success(entity);
    }

    /**
    * @Author GroundDemo
    * @Description 回退版本信息
    * @Date 10:57 2024/9/22
    * @Param [ywuWikiDocVersionDto]
    * @return com.ywu.common.result.CommonResult<java.lang.Object>
    **/
    @Transactional
    public CommonResult<Object> backVersionInfo(YwuWikiDocVersionDto ywuWikiDocVersionDto) {
        // 查询待回退的版本信息
        YwuWikiDocVersionEntity search = new YwuWikiDocVersionEntity();
        search.setResourceId(ywuWikiDocVersionDto.getResourceId());
        search.setVersion(ywuWikiDocVersionDto.getVersion());
        YwuWikiDocVersionEntity queryEntity = repository.getEntity(search);
        // 添加草稿版本信息
        addDraftInfo(queryEntity);
        // 修改hasNotReleased状态
        YwuWikiDocEntity ywuWikiDocEntity = new YwuWikiDocEntity();
        ywuWikiDocEntity.setId(ywuWikiDocVersionDto.getResourceId());
        ywuWikiDocEntity.setHasNotReleased(true);
        ywuWikiDocEntity.updateInfo(YwuContextHolder.getCurrentContext().getYwuContextUser().getUserAccount());
        docRepository.updateYwuWikiDocEntity(ywuWikiDocEntity);
        return CommonResult.success(null);
    }

    /**
    * @Author GroundDemo
    * @Description 根据resourceId批量查询草稿版本数据
    * @Date 12:47 2024/9/22
    * @Param [resourceIds]
    * @return java.util.List<com.ywu.wiki.standard.entity.YwuWikiDocVersionEntity>
    **/
    public List<YwuWikiDocVersionEntity> queryDraftListByResourceIds(List<String> resourceIds) {
        if (CollectionUtils.isEmpty(resourceIds)) {
            return new ArrayList<>();
        }
        return repository.queryDraftListByResourceIds(resourceIds);
    }

    /**
    * @Author GroundDemo
    * @Description 根据resourceId查询草稿
    * @Date 12:54 2024/9/22
    * @Param [ywuWikiDocVersionEntity]
    * @return com.ywu.wiki.standard.entity.YwuWikiDocVersionEntity
    **/
    public YwuWikiDocVersionEntity queryDraftInfoByResourceId(YwuWikiDocVersionEntity ywuWikiDocVersionEntity) {
        YwuWikiDocVersionDto ywuWikiDocVersionDto = new YwuWikiDocVersionDto();
        BeanUtils.copyProperties(ywuWikiDocVersionEntity, ywuWikiDocVersionDto);
        ywuWikiDocVersionDto.setVersion(0);
        return repository.queryVersionInfo(ywuWikiDocVersionDto);
    }
}
